package com.sunny.design.singleton.lazy;

/**
 * 懒汉式单例
 *  被外部类调用时才创建实例
 *
 * @author Sunny
 * @date 2019/12/29 15:40
 */
public class LazyDoubleLockCheckSingleton {
    private LazyDoubleLockCheckSingleton(){}

    private static volatile LazyDoubleLockCheckSingleton INSTANCE;

    /**
     * 为什么使用双重检查锁?
     *
     *  如果两个线程都进入到外层if中
     *  A线程先获得了锁,B线程阻塞,A先创建了对象并返回.
     *  B线程获得锁后继续执行,如果没有内层if判断
     *  B线程就会再创建一个对象,只是引用地址是同一个
     *  因为引用已经存在了,所以只是将引用地址指向了另一块内存
     *
     * @return
     */
    public static LazyDoubleLockCheckSingleton getInstance() {
        if (INSTANCE == null) {
            synchronized (LazyDoubleLockCheckSingleton.class) {
                if (INSTANCE == null) {
                    INSTANCE = new LazyDoubleLockCheckSingleton();
                }
            }
        }
        return INSTANCE;
    }
}
